package datos;

import logica.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/** Maneja la persistencia de las clases ArbolDeDatos y Estadisticas. */
public class DatosDelJuego {

	@SuppressWarnings("unchecked")
	private static <T> T desserializar(String dire) {
		T p = null;
		try {
			FileInputStream fis = new FileInputStream(dire);
			ObjectInputStream ois = new ObjectInputStream(fis);
			p = (T) ois.readObject();
			ois.close();
		} catch (Exception ex) {
			ex.printStackTrace();
			p = null;
		}
		return p;
	}

	private static <T> void serializar(T datos, String dire) {
		try {
			FileOutputStream fos = new FileOutputStream(dire);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(datos);
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// Comprueba que el fichero exista.
	@SuppressWarnings({ "unused", "resource" })
	private static <T> boolean estaSerializado(String dire) {

		try {
			FileInputStream fis = new FileInputStream(dire);
			// @SuppressWarnings("unused")
			// ObjectInputStream ois = new ObjectInputStream(fis);
		} catch (Exception ex) {
			// ex.printStackTrace();
			// System.out.println("LoadHarCode");
			return false;
		}

		return true;
	}

	/** Desserializa el ArbolDeAtributos. */
	public static ArbolDeAtributos recuperarArbolDeAtributos() {

		if (estaSerializado("db/animales.bin")) {
			return desserializar("db/animales.bin");
		} else
			return cargaArbolDeAtributosHC();
	}

	/** Serializa el ArbolDeATributos. */
	public static void guardarArbolDeAtributos(ArbolDeAtributos animales) {
		serializar(animales, "db/animales.bin");
	}

	/**  Desserializa las Estadisticas. */
	public static Estadisticas recuperarEstadisticas() {

		if (!estaSerializado("db/estadisticas.bin"))
			serializar(new Estadisticas(), "db/estadisticas.bin");

		return desserializar("db/estadisticas.bin");
	}

	/** Serializa las Estadisticas. */
	public static void guardarEstadisticas(Estadisticas estadisticas) {
		serializar(estadisticas, "db/estadisticas.bin");
	}

	/** Crea un ArbolDeAtributos harcodeado. */
	private static ArbolDeAtributos cargaArbolDeAtributosHC() {

		ArbolDeAtributos base = new ArbolDeAtributos();
		
		// Se crea un elemento con nombre , imagen y todos sus atributos. 
		Elemento animal;

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("su esqueleto es de cartílago");
		animal.addAtributo("es un gran depredador");
		animal.addAtributo("posee aleta dorsal");
		animal.addAtributo("es de color blanco");
		animal.setNombre("Tiburon blanco");
		animal.setImagen("img/elementos/tiburonblanco.jpg");
		// Se introduce al arbol.
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("es un insecto");
		animal.addAtributo("posee alas coloreadas");
		animal.setNombre("Mariposa");
		animal.setImagen("img/elementos/mariposa.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un ave");
		animal.addAtributo("posee gran tamaño");
		animal.addAtributo("tiene cabeza y pico grandes");
		animal.addAtributo("sus garras son poderosas");
		animal.setNombre("Águila");
		animal.setImagen("img/elementos/aguila.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un reptil");
		animal.addAtributo("es una serpiente venenosa");
		animal.setNombre("Cobra");
		animal.setImagen("img/elementos/cobra.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un anfibio");
		animal.addAtributo("carece de cola");
		animal.addAtributo("su cuerpo es corto y ancho");
		animal.addAtributo("salta");
		animal.setNombre("Rana");
		animal.setImagen("img/elementos/rana.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("es acuático");
		animal.addAtributo("posee gran tamaño");
		animal.setNombre("Ballena");
		animal.setImagen("img/elementos/ballena.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un molusco");
		animal.addAtributo("tienen sólo una concha");
		animal.addAtributo("posee concha espiralada");
		animal.addAtributo("se desplaza arrastrándose dejando mucus");
		animal.setNombre("Caracol");
		animal.setImagen("img/elementos/caracol.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un gusano");
		animal.addAtributo("tiene el cuerpo segmentado en anillos");
		animal.addAtributo("es terrestre");
		animal.addAtributo("se utiliza como carnada en la pesca");
		animal.setNombre("Lombriz");
		animal.setImagen("img/elementos/lombriz.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un molusco");
		animal.addAtributo("tienen dos conchas");
		animal.addAtributo("posee gran interés económico y gastronómico");
		animal.setNombre("Mejillón");
		animal.setImagen("img/elementos/mejillon.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un molusco");
		animal.addAtributo("No tiene concha");
		animal.addAtributo("es marino y carnivoro");
		animal.addAtributo("posee 8 brazos y 2 tentáculos");
		animal.setNombre("Calamar");
		animal.setImagen("img/elementos/calamar.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("es un arácnido");
		animal.addAtributo("parásito que se alimenta de sangre");
		animal.addAtributo("suele estar en animales domésticos");
		animal.setNombre("Garrapata");
		animal.setImagen("img/elementos/garrapata.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("es un insecto");
		animal.addAtributo("vive bajo tierra");
		animal.setNombre("Hormiga");
		animal.setImagen("img/elementos/hormiga.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("posee multitud de pares de patas");
		animal.addAtributo("su cuerpo está formado por 21 anillos");
		animal.addAtributo("posee 42 patas");
		animal.setNombre("Cienpiés");
		animal.setImagen("img/elementos/cienpies.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("es un insecto");
		animal.addAtributo("es acuático");
		animal.setNombre("Cangrejo");
		animal.setImagen("img/elementos/cangrejo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("es un arácnido");
		animal.addAtributo("es venenoso");
		animal.addAtributo("tiene su cola terminada en un aguijón");
		animal.setNombre("escorpión");
		animal.setImagen("img/elementos/escorpion.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee un esqueleto externo");
		animal.addAtributo("es un arácnido");
		animal.addAtributo("es venenoso");
		animal.setNombre("Araña");
		animal.setImagen("img/elementos/arana.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("tiene el cuerpo con simetría radial");
		animal.addAtributo("tiene forma de disco pentagonal");
		animal.addAtributo("tiene cinco brazos o más");
		animal.setNombre("Estrella de mar");
		animal.setImagen("img/elementos/estrella de mar.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("tiene esqueleto óseo");
		animal.addAtributo("habita en aguas muy profundas");
		animal.setNombre("Celacanto");
		animal.setImagen("img/elementos/celacanto.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("su esqueleto es de cartílago");
		animal.addAtributo("su boca tiene forma de martillo");
		animal.setNombre("Pez martillo");
		animal.setImagen("img/elementos/pezmartillo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("No posee madibula");
		animal.addAtributo("su cuerpo es alargado");
		animal.addAtributo("está cubierto por una sustancia legamosa");
		animal.setNombre("Mixine");
		animal.setImagen("img/elementos/mixine.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("tiene tentáculos");
		animal.addAtributo("flota en el agua");
		animal.addAtributo("es transparente y venenosa");
		animal.setNombre("Medusa");
		animal.setImagen("img/elementos/medusa.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("tiene esqueleto óseo");
		animal.addAtributo("posee pulmones funcionales");
		animal.setNombre("Pez pulmonado de Queensland");
		animal.setImagen("img/elementos/pezpulmonado.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("su esqueleto es de cartílago");
		animal.addAtributo("tiene forma aplanada");
		animal.addAtributo("tiene cola fina");
		animal.addAtributo("tiene boca en la parte inferior del cuerpo");
		animal.setNombre("Raya");
		animal.setImagen("img/elementos/raya.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un pez");
		animal.addAtributo("No posee madibula");
		animal.addAtributo("su cuerpo es gelatinoso");
		animal.addAtributo(" su cuerpo es cilíndrico, sin escamas");
		animal.addAtributo("posee círculos concéntricos de dientes córneos");
		animal.setNombre("Lamprea");
		animal.setImagen("img/elementos/lampreas.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un ave");
		animal.addAtributo("tiene cresta");
		animal.setNombre("Gallo");
		animal.setImagen("img/elementos/gallo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un ave");
		animal.addAtributo("es acuática");
		animal.setNombre("Cisne");
		animal.setImagen("img/elementos/cisne.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un ave");
		animal.addAtributo("es un ave rapaz nocturno");
		animal.setNombre("Lechuza");
		animal.setImagen("img/elementos/lechuza.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un ave");
		animal.addAtributo("es un ave multicolor");
		animal.addAtributo("a veces puede imitar la voz humana");
		animal.setNombre("Papagayo");
		animal.setImagen("img/elementos/papagayo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un ave");
		animal.addAtributo("posee un pico muy desarollado y de vivos colores");
		animal.setNombre("Tucán");
		animal.setImagen("img/elementos/tucan.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un reptil");
		animal.addAtributo("tiene gran tamaño");
		animal.addAtributo("posee una poderosa mandíbula y dientes muy afilados");
		animal.setNombre("Cocodrilo");
		animal.setImagen("img/elementos/cocodrilo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un reptil");
		animal.addAtributo("posee un caparazón");
		animal.setNombre("Tortuga");
		animal.setImagen("img/elementos/tortuga.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un anfibio");
		animal.addAtributo("su cuerpo y cola son alargados");
		animal.setNombre("Salamandra");
		animal.setImagen("img/elementos/salamandra.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("tiene pelaje rayado");
		animal.addAtributo("es de color blanco y negro");
		animal.setNombre("Cebra");
		animal.setImagen("img/elementos/cebra.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("salta y tiene orejas alargadas");
		animal.setNombre("Conejo");
		animal.setImagen("img/elementos/conejo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("es acuático");
		animal.addAtributo("tiene el hocico alargado");
		animal.setNombre("Delfín");
		animal.setImagen("img/elementos/delfin.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("su cabeza y orejas son grandes");
		animal.addAtributo("posee una trompa muy alargada");
		animal.setNombre("Elefante");
		animal.setImagen("img/elementos/elefante.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("es un felino");
		animal.addAtributo("los machos poseen melena");
		animal.setNombre("León");
		animal.setImagen("img/elementos/leon.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("posee columna vertebral");
		animal.addAtributo("es un mamífero");
		animal.addAtributo("Ladra");
		animal.addAtributo("es el mejor amigo del hombre");
		animal.setNombre("Perro");
		animal.setImagen("img/elementos/perro.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un gusano");
		animal.addAtributo("tiene el cuerpo redondo no segmentado");
		animal.addAtributo("es un parásito del hombre");
		animal.setNombre("Lombriz solitaria");
		animal.setImagen("img/elementos/lombrizintestinal.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un gusano");
		animal.addAtributo("tiene el cuerpo de forma plana");
		animal.addAtributo("su reproducción es hermafrodita");
		animal.addAtributo("tiene forma acintada");
		animal.setNombre("Planaria");
		animal.setImagen("img/elementos/planaria.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("es un gusano");
		animal.addAtributo("es la larva de un insecto");
		animal.addAtributo("en su forma adulta vuela");
		animal.setNombre("Larva de mosca");
		animal.setImagen("img/elementos/larvademosca.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("tiene el cuerpo con simetría radial");
		animal.addAtributo("tiene forma globosa y púas móviles");
		animal.setNombre("Erizo de mar");
		animal.setImagen("img/elementos/erizo.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("tiene tentáculos");
		animal.addAtributo("flotan en el agua");
		animal.addAtributo("es transparente y venenosa");
		animal.setNombre("Medusa");
		animal.setImagen("img/elementos/medusa.jpg");
		base.agregar(animal);

		animal = new Elemento();
		animal.addAtributo("tiene tentáculos");
		animal.addAtributo("está fija a un objeto");
		animal.addAtributo("se fijan a las rocas");
		animal.setNombre("Pólipo");
		animal.setImagen("img/elementos/polipo.jpg");
		base.agregar(animal);

		return base;
	}

	public static void main(String[] args) {

		// ArbolDeAtributos datos =
		// DatosDelJuego.cargaArbolDeAtributosHardCode();
		// DatosDelJuego.guardarArbolDeAtributos(datos);
		// ArbolDeAtributos prueba = DatosDelJuego.recuperarArbolDeAtributos();
		// System.out.println(prueba);

		// DatosDelJuego.guardarEstadisticas(new Estadisticas());
		// System.out.println(DatosDelJuego.recuperarEstadisticas());

	}

}